package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import co.gov.medellin.ssti.sub.model.dao.IModificarBOTDAO;
import co.gov.medellin.ssti.sub.model.dao.impl.ModificarBOTDAOImpl;

import com.cs.beneficios.business.entity.AtributosDAO;
import com.cs.beneficios.business.entity.BeneficioDAO;
import com.cs.beneficios.business.entity.SubProgramaDAO;
import com.cs.beneficios.business.model.AtributoVO;
import com.cs.beneficios.business.model.BeneficiarioVO;
import co.gov.medellin.ssti.sub.model.vo.ModificarBOTVO;
import com.cs.beneficios.business.model.SubProgramaVO;
import com.cs.beneficios.common.ConnectionFactory;
import com.cs.paoyer.administration.business.model.UserVO;

public class ModificarBOTAction extends Action {
	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		ConnectionFactory cf = new ConnectionFactory();
		SubProgramaVO codigosub = new SubProgramaVO();
		SubProgramaDAO sub = new SubProgramaDAO(cf);

		HttpSession session = request.getSession();
		String strCodigoSubpro = (String) request.getAttribute("codbene");
		String strCodigoBeneficiario = (String) request.getAttribute("code");
		String strCodigoBOT = request.getParameter("codeBot");
		codigosub.setCode(new Long(strCodigoSubpro));

		// Proceso para la auditoria
		String terminalAddress = request.getRemoteAddr();
		String strTerminal = ("WEB=" + terminalAddress);
		Calendar c = Calendar.getInstance();
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		// Fin del proceso

		BeneficiarioVO beneVO = new BeneficiarioVO();
		List coPropBeneficiario = (List) session.getAttribute("beneSelected");
		List lAtributos = new LinkedList();

		// Proceso para convertir los atributos que no tienen valores en la
		// lista
		try {
			AtributosDAO atriDAO = new AtributosDAO(cf);
			int conversion = atriDAO.getAtributosVallista(strCodigoSubpro);
			cf.closeConnection(atriDAO.getConn());
		} catch (SQLException e) {
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
		}

		UserVO user = (UserVO) session.getAttribute("userInfo");

		Collection atributos = null;
		// Collection Csedes = null;

		AtributosDAO objAtributoDAO;

		// SedeDAO objSedeDAO;
		session.setAttribute("beneficiario", strCodigoBeneficiario);
		try {

			/*
			 * List lNom =
			 * (List)sub.findSubProgramaByCriterea(codigosub,user.getCode(),
			 * user.getUserGroupName(),user.getCodeArea());
			 * cf.closeConnection(sub.getConn());
			 * 
			 * codigosub = (SubProgramaVO)lNom.get(0); String strNombre =
			 * codigosub.getNombre();
			 * session.setAttribute("NombreSub",strNombre);
			 */

			objAtributoDAO = new AtributosDAO(cf);
			atributos = objAtributoDAO.GetAtributos(strCodigoSubpro, "A", 0);
			cf.closeConnection(objAtributoDAO.getConn());

			/*
			 * same reason as below. test List f = (List) atributos; for (int i
			 * = 0; i < f.size(); i++) { AtributoVO atrVO = (AtributoVO)
			 * f.get(i); System.out.println("atributovf " +
			 * atrVO.getDescripcion()); List vfs = (List)
			 * atrVO.getValoresflexibles(); if (vfs != null && vfs.size() > 0) {
			 * Iterator it = atrVO.getValoresflexibles().iterator(); while
			 * (it.hasNext()) { ValorFlexibleVO vf = (ValorFlexibleVO)
			 * it.next(); System.out.println("codigoValor: " +
			 * vf.getCodigoValor()); System.out.println("codigoVfl: " +
			 * vf.getCodigovfl()); } } }
			 */

			int tam = atributos.size();
			String strTamano = String.valueOf(tam);

			session.setAttribute("tamanoLista", strTamano);
			session.setAttribute("ListaAtributos", atributos);

			/*
			 * objSedeDAO = new SedeDAO(cf); Csedes =
			 * objSedeDAO.GetTotalSedebyUser(user.getCode(),new
			 * Long(strCodigoSubpro
			 * ),user.getUserGroupName(),user.getCodeArea());
			 * cf.closeConnection(objSedeDAO.getConn()); if((Object)Csedes !=
			 * null) { if(Csedes.size()>0){
			 * session.setAttribute("ListaSede",Csedes); } else {
			 * session.removeAttribute("ListaSede"); }
			 * 
			 * }
			 */

			// Proceso para calcular la edad
			beneVO = (BeneficiarioVO) coPropBeneficiario.get(0);
			String strFechaNacimiento = beneVO.getFechaNacimiento();
			if (strFechaNacimiento != null && !strFechaNacimiento.equals("")) {
				AtributoVO objAtriVO = new AtributoVO();
				lAtributos = (List) atributos;
				if (atributos != null && atributos.size() != 0) {
					for (int i = 0; i < lAtributos.size(); i++) {
						objAtriVO = (AtributoVO) lAtributos.get(i);
						if ((objAtriVO.getDescripcion()).equals("EDAD")) {
							Calendar calendario = Calendar.getInstance();
							String strFechaActual = (calendario
									.get(Calendar.DAY_OF_MONTH) < 10 ? "0" : "")
									+ calendario.get(Calendar.DAY_OF_MONTH)
									+ "/"
									+ ((calendario.get(Calendar.MONTH) + 1) < 10 ? "0"
											: "")
									+ (calendario.get(Calendar.MONTH) + 1)
									+ "/" + calendario.get(Calendar.YEAR);

							String ArrFechaActual[] = strFechaActual.split("/");
							String strDayAc = ArrFechaActual[0];
							String strMonthAc = ArrFechaActual[1];
							String strYearAc = ArrFechaActual[2];

							String ArrFechaNacimiento[] = ((String) beneVO
									.getFechaNacimiento()).split("/");
							String strDayNa = ArrFechaNacimiento[0];
							String strMonthNa = ArrFechaNacimiento[1];
							String strYearNa = ArrFechaNacimiento[2];

							// resto los a�os de las dos fechas
							int iEdad = Integer.parseInt(strYearAc)
									- Integer.parseInt(strYearNa) - 1; // -1
																		// porque
																		// no se
																		// si ha
																		// cumplido
																		// a�os
																		// ya
																		// este
																		// a�o

							// si resto los meses y me da menor que 0 entonces
							// no ha cumplido a�os. Si da mayor si ha cumplido
							if (((Integer.parseInt(strMonthAc)) - (Integer
									.parseInt(strMonthNa))) > 0)
								iEdad += 1;

							if (((Integer.parseInt(strMonthAc)) - (Integer
									.parseInt(strMonthNa))) == 0) {
								// si resto los dias y me da menor que 0
								// entonces no ha cumplido a�os. Si da mayor o
								// igual si ha cumplido
								if (((Integer.parseInt(strDayAc)) - (Integer
										.parseInt(strDayNa))) >= 0)
									iEdad += 1;
							}

							request.setAttribute("Edad", String.valueOf(iEdad));
							session.setAttribute("DateBirth",
									(String) beneVO.getFechaNacimiento());
						}
					}

				}
			}
			// Fin del proceso

			// proceso que traer el resto de la informacion
			IModificarBOTDAO objModificarBOT = new ModificarBOTDAOImpl();
			List latributos = (List) objModificarBOT
					.findAtributosSubpro(strCodigoSubpro);
			List lResultados = new LinkedList();
			// String strSede =
			// objModificarBOT.GetSedeOtorgamiento(strCodigoBOT);
			// session.setAttribute("codesede", strSede);
			String strSede = (String) session.getAttribute("codesede");
			for (int i = 0; i < latributos.size(); i++) {
				AtributoVO atrivo = new AtributoVO();
				atrivo = (AtributoVO) latributos.get(i);
				if (atrivo.getTipoatributo().equals("R")) {
					String strValor = objModificarBOT.findBeneficiarioAtri(
							atrivo.getTipodato(), strCodigoBeneficiario,
							atrivo.getCodatributo());
					ModificarBOTVO modifBOTVO = new ModificarBOTVO();
					if (strValor != null && !strValor.equals("")) {
						modifBOTVO.setNombre(atrivo.getNombre());
						modifBOTVO.setValorInicial(strValor);
						modifBOTVO.setTipoatributo(atrivo.getTipoatributo());
						lResultados.add(modifBOTVO);
						modifBOTVO = null;
					} else {
						modifBOTVO.setNombre(atrivo.getNombre());
						modifBOTVO.setValorInicial("");
						modifBOTVO.setTipoatributo(atrivo.getTipoatributo());
						lResultados.add(modifBOTVO);
						// System.out.println("DAS IT MANE");
						modifBOTVO = null;
					}
				} else {
					if (!strSede.equals("")) {
						// consulta valor y codigo de atributos del beneficio
						ModificarBOTVO modificarBOTVO = objModificarBOT
								.findBeneficioAtri(atrivo.getTipodato(),
										strCodigoBOT, atrivo.getCodatributo());

						modificarBOTVO.setNombre(atrivo.getNombre());
						modificarBOTVO
								.setTipoatributo(atrivo.getTipoatributo());
						if (modificarBOTVO.getValorInicial() == null) {
							modificarBOTVO.setValorInicial("");
						}
						lResultados.add(modificarBOTVO);
						/*
						 * ResultSet rst = objModificarBOT.Getbeneficioatri(
						 * atrivo.getTipodato(), strCodigoBOT,
						 * atrivo.getCodatributo()); ModificarBOTVO modifBOTVO =
						 * new ModificarBOTVO();
						 */

						/*
						 * if (rst.next()) {
						 * modifBOTVO.setNombre(atrivo.getNombre());
						 * modifBOTVO.setValorInicial(rst.getString("valor"));
						 * modifBOTVO.setCodigo(new Long(rst
						 * .getString("codigo"))); modifBOTVO
						 * .setTipoatributo(atrivo.getTipoatributo());
						 * lResultados.add(modifBOTVO); modifBOTVO = null; }
						 * else { modifBOTVO.setNombre(atrivo.getNombre());
						 * modifBOTVO.setValorInicial(""); modifBOTVO
						 * .setTipoatributo(atrivo.getTipoatributo());
						 * lResultados.add(modifBOTVO); modifBOTVO = null; }
						 */
					}
				}
			}
			session.setAttribute("listaresultados", lResultados);

			/*
			 * me mame de hacer debug mejor imprimo. List ff = (List)
			 * lResultados; for (int i = 0; i < ff.size(); i++) { ModificarBOTVO
			 * atrVO = (ModificarBOTVO) ff.get(i);
			 * System.out.println("ModificarBOTVO nombre: " + atrVO.getNombre()
			 * + "; valorinicial: " + atrVO.getValorInicial() +"; codigo: "
			 * +atrVO.getCodigo()); }
			 */

			// fin del proceso

			// Proceso para obtener el valor del beneficio
			String strCostBene = null;
			BeneficioDAO objBeneDAO = new BeneficioDAO(cf);
			strCostBene = objBeneDAO.getCostBOT(strCodigoBOT);
			if (strCostBene != null) {
				request.setAttribute("CostBene", strCostBene);
			}
			// Fin del proceso
			// Proceso para obtener la fecha
			String strDate = objBeneDAO.getFechaBOT(strCodigoBOT);

			if (strDate == null) {

				SimpleDateFormat dateFormat2 = new SimpleDateFormat(
						"yyyy-MM-dd");
				strDate = dateFormat2.format(c.getTime());
			}

			request.setAttribute("DateBene", strDate);
			// Fin del proceso

			// Proceso para obtener el tipo beneficio
			String strTypeBot = objBeneDAO.getTipoBeneficio(strCodigoBOT);
			if (strTypeBot != null) {
				request.setAttribute("TipoBene", strTypeBot);
			}
			// Fin del proceso

			String tercero = objBeneDAO.getTercero(strCodigoBOT);

			if (tercero != null) {
				request.setAttribute("Tercero", tercero);
			}
			cf.closeConnection(objBeneDAO.getConn());

		} catch (SQLException e) {
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
		}

		return mapping.findForward("success");
	}
}
